package common.service;

import common.model.dto.UserCacheInfo;
import common.model.po.*;
import common.model.response.base.Result;
import org.redisson.api.RMap;

import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * Redisson缓存服务类
 *
 * @author 米泽鹏
 * @since 2022-02-26
 */
public interface RedissonCacheService {

	/**
	 * 获取用户token缓存
	 */
	String getLoginTokenStringByUserId(Long userId);

	/**
	 * 添加用户token缓存
	 *
	 * @param userId     Long
	 * @param token      String
	 * @param expireDate 过期时刻
	 * @return Result<Boolean> 新key返回true，旧key覆盖返回false
	 */
	Result<Boolean> cacheLoginTokenString(Long userId, String token, Date expireDate);

	/**
	 * 删除用户token缓存
	 */
	Result<Long> removeLoginTokenStringByUserId(Long userId);

	/**
	 * 获取用户缓存
	 */
	List<UserCacheInfo> getSysUserCache();

	/**
	 * 更新用户缓存
	 */
	Result<?> cacheSysUser();

	/**
	 * 更新用户缓存
	 */
	Result<?> cacheSysUser(List<SysUser> userList);

	RMap<Long, Set<Long>> getAllUserIdCacheByRoleId();

	RMap<Long, Set<Long>> getAllRoleIdCacheByUserId();

	/**
	 * 更新用户角色关联关系缓存
	 */
	Result<?> cacheSysUserRole();

	/**
	 * 更新用户角色关联关系缓存
	 */
	Result<?> cacheSysUserRole(List<SysUserRole> userRoleList);

	/**
	 * 获取角色缓存
	 */
	List<SysRole> getSysRoleCache();

	/**
	 * 更新角色缓存
	 */
	Result<?> cacheSysRole();

	/**
	 * 更新角色缓存
	 */
	Result<?> cacheSysRole(List<SysRole> roleList);

	/**
	 * 根据角色id获取该角色所有权限id
	 */
	RMap<Long, Set<Long>> getAllAuthIdCacheByRoleId();

	/**
	 * 根据权限id获取该权限所有角色id
	 */
	RMap<Long, Set<Long>> getAllRoleIdCacheByAuthId();

	/**
	 * 更新角色权限关联关系缓存
	 */
	Result<?> cacheSysRoleAuthority();

	/**
	 * 更新角色权限关联关系缓存
	 */
	Result<?> cacheSysRoleAuthority(List<SysRoleAuthority> roleAuthorityList);

	/**
	 * 获取权限缓存
	 */
	List<SysAuthority> getSysAuthorityCache();

	/**
	 * 更新权限缓存
	 */
	Result<?> cacheSysAuthority();

	/**
	 * 更新权限缓存
	 */
	Result<?> cacheSysAuthority(List<SysAuthority> authorityList);

	/**
	 * 获取业务编码缓存
	 */
	List<SysBusinessCode> getSysBusinessCodeCache();

	/**
	 * 获取业务编码详情缓存
	 */
	List<SysBusinessCodeDetail> getSysBusinessCodeDetailCache();

	/**
	 * 更新业务编码缓存
	 */
	Result<?> cacheSysBusinessCode();

	/**
	 * 获取修改密码token缓存
	 */
	String getModifyPasswordTokenStringByUserId(Long userId);

	/**
	 * 添加修改密码token缓存
	 *
	 * @param userId     Long
	 * @param token      String
	 * @param expireDate 过期时刻
	 * @return Result<Boolean> 新key返回true，旧key覆盖返回false
	 */
	Result<Boolean> cacheModifyPasswordTokenString(Long userId, String token, Date expireDate);

	/**
	 * 删除修改密码token缓存
	 *
	 * @param userId Long
	 * @return Result<Long> 从hash中删除的key的数量
	 */
	Result<Long> removeModifyPasswordTokenString(Long userId);

	/**
	 * 获取邮箱激活token缓存
	 *
	 * @param userId Long
	 * @return String token字符串
	 */
	String getActivateEmailTokenStringByUserId(Long userId);

	/**
	 * 添加邮箱激活token缓存
	 *
	 * @param userId     Long
	 * @param token      String
	 * @param expireDate 过期时刻
	 * @return Result<Boolean> 新key返回true，旧key覆盖返回false
	 */
	Result<Boolean> cacheActivateEmailTokenString(Long userId, String token, Date expireDate);

	/**
	 * 删除邮箱激活token缓存
	 *
	 * @param userId Long
	 * @return Result<Long> 从hash中删除的key的数量
	 */
	Result<Long> removeActivateEmailTokenString(Long userId);

	/**
	 * 获取邮箱换绑token缓存
	 *
	 * @param userId Long
	 * @return String token字符串
	 */
	String getModifyEmailTokenStringByUserId(Long userId);

	/**
	 * 添加邮箱换绑token缓存
	 *
	 * @param userId     Long
	 * @param token      String
	 * @param expireDate 过期时刻
	 * @return Result<Boolean> 新key返回true，旧key覆盖返回false
	 */
	Result<Boolean> cacheModifyEmailTokenString(Long userId, String token, Date expireDate);

	/**
	 * 删除邮箱换绑token缓存
	 *
	 * @param userId Long
	 * @return Result<Long> 从hash中删除的key的数量
	 */
	Result<Long> removeModifyEmailTokenString(Long userId);

}
